/*************************************************
  * 描述：热键注册与注销
  *
  * File：hotkey.h
  * Author：chenyujin@mozihealthcare.cn
  * Date：2025/9/10
  * Update：
  * ************************************************/
#ifndef COREXI_COMMON_PC_HOTKEY_H
#define COREXI_COMMON_PC_HOTKEY_H

#include <QWidget>
#include <common/export.h>
#include <string>

#ifdef Q_OS_WIN
#include <windows.h>
#endif


/*
 *参照CSharp版本的需求，CSharp版本仅仅是对于Windows的快捷键注册API进行了简单封装
 *没有增加额外的逻辑，接口较为底层
 *因此国产化版本暂时也参考CSharp版本设计方案
 *如果想要更易用的热键注册方案，可参考小精灵的键盘插件
 */
class CXI_COMMON_EXPORT HotKey
{
public:
#pragma region 旧版实现，暂时弃用
	// enum KeyModifiers
	// {
	// 	None = 0,
	// 	Alt = 1,
	// 	Ctrl = 2,
	// 	Shift = 4,
	// 	WindowsKey = 8
	// };

	// 下面这个两个接口是为了适配CSharp接口的
	// #ifdef Q_OS_WIN
	/**
	 * 注册热键
	 * @param hwnd 目标窗口句柄 (nullptr 表示线程级/全局)
	 * @param id 热键 ID (调用者自己维护，不要重复)
	 * @param keyModifiers 修饰键(MOD_CONTROL / MOD_ALT / MOD_SHIFT / MOD_WIN，可组合)
	 * @param vk 虚拟键码(VK_F1, 'A' -> VkKeyScanA('A') & 0xFF)
	 * @return 如果函数执行失败，返回值为0。要得到扩展错误信息，调用GetLastError。
	 */
	// static bool registerHotKey(HWND hwnd, int id, unsigned int keyModifiers, unsigned int vk);

	/**
	 * 注销热键
	 * @param hwnd 目标窗口句柄 (nullptr 表示线程级/全局)
	 * @param id 已注册的热键 ID
	 * @return 如果函数执行失败，返回值为0。要得到扩展错误信息，调用GetLastError。
	 */
	// static bool unregisterHotKey(HWND hwnd, int id);
	// #endif
#pragma endregion

	// 下面为新增的，用于跨平台的接口
	/**
	 * 为窗体注册快捷键
	 * @param widget
	 * @param hotKey 格式化字符串："Shift+Ctrl+Alt+C"
	 * @return 注册成功后的快捷键ID, -1 表示失败
	 */
	static int registerHotKey(const QWidget* widget, const std::string& hotKey);

	/**
	 * 为窗体注销快捷键
	 * @param widget
	 * @param id
	 * @return true 注销成功
	 */
	static bool unregisterHotKey(QWidget* widget, int id);
};
#endif//COREXI_COMMON_PC_HOTKEY_H
